﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Documents;

namespace J1
{
    class Program
    {
        public static Dictionary<int, Student> list = new Dictionary<int, Student>();
        public static Hashtable ht = new Hashtable();
        
        static void Main(string[] args)
        {
            //添加3个类，分别实现 IComparer<T>接口，实现对Student类的三个字段的排序。
            //1、学生类：学号、姓名、年龄
            //2、请选择：1、添加学生信息。2、查询学生信息，3、删除学生信息。
            //3、重复的学号不能添加。
            //4、查询学生信息功能中有：1、查询所有（按学号排序）2、查询所有（按姓名排序），
            //3、查询所有（按年龄排序）
            //4、按学号查询（查没有，则打印查无此学生）5、退出
            {
                ht.Add(3, new Student("3", "age", "19"));
                ht.Add(2, new Student("2", "cge", "20"));
                ht.Add(1, new Student("1", "bge", "21"));
            }
            while (true)
            {
                Console.WriteLine("请选择：1、添加学生信息。2、查询学生信息，3、删除学生信息");
                int k = int.Parse(Console.ReadLine());
                switch (k)
                {
                    case 1:
                        Program.Add(); //1、添加学生信息。
                        break;
                    case 2:
                        Program.Inquire();//2、查询学生信息
                        break;
                    case 3:
                        Program.Delete();//3、删除学生信息
                        break;
                    case 4:
                        Console.WriteLine("感谢使用，再见");//4、退出
                        return;
                    default:
                        Console.WriteLine("输入错误，请重新输入");
                        break;
                }
            }


        }

        private static void Delete()
        {
            Console.WriteLine("请输入学生学号：");
            string Number =Console.ReadLine();
            if (!ht.ContainsKey(Number))
            {
                Console.WriteLine("学号不存在，请重新输入");
                return;
            }
            ht.Remove(Number);
            Console.WriteLine("删除成功！");
        }

        private static void Inquire()
        {
            while (true)
            {
                Console.WriteLine("1、查询所有（按学号排序）2、查询所有（按姓名排序），3、查询所有（按年龄排序）4、按学号查询（查没有，则打印查无此学生）5、退出");
                int key = int.Parse(Console.ReadLine());
                switch (key)
                {
                    case 1:
                        F1();
                        break;
                    case 2:
                        F2();
                        break;
                    case 3:
                        F3();
                        break;
                    case 4:
                        F4();
                        break;
                    case 5:
                        Console.WriteLine("感谢你使用查询功能，再见！！！");
                        return;
                    default:
                        Console.WriteLine("输入错误，请重新输入");
                        break;
                }
            }
        }

        private static void F4()
        {
            Console.WriteLine("请输入学生学号");
            int num = int.Parse(Console.ReadLine());
            //判断双列集合list的key(键) 是否包含用户输入的学号
            if (!ht.ContainsKey(num))
            {
                //如果没有 则打印"查无此学生"
                Console.WriteLine("查无此学生");
                //因为没有 所以下面代码执行无意义 return 结束这个方法返回到 查询功能 的菜单中
                return;
            }
            else
            {
                //进了else 说明有这个学生 则打印
                Console.WriteLine(ht[num]);
                //集合名[key] 可以直接打印出对应的value 
            }
        }

        private static void F3()
        {
            List<Student> alist = new List<Student>();
            foreach (var value in ht.Values)
            {
                alist.Add((Student)value);
            }
            alist.Sort(new SortByAge());
            foreach (var item in alist)
            {
                Console.WriteLine(item);
            }
        }

        private static void F2()
        {
            List<Student> alist = new List<Student>();
            foreach (var value in ht.Values)
            {
                alist.Add((Student)value);
            }
            alist.Sort(new SortByName());
            foreach (var item in alist)
            {
                Console.WriteLine(item);
            }
        }

        private static void F1()
        {
            //双列集合没有Sort方法 所以定义一个list集合 来装双列集合中的Values（值）
            List<Student> alist = new List<Student>();

            //list.Values 返回list双列集合中的Value们 
            //遍历这个list.values的结果 得到每一个value 并把他装进上面定义好的单列集合中
            foreach (var value in ht.Values)
            {
                //把value装进上面定义好的单列集合中
                alist.Add((Student)value);
            }

            //传入一个自己定义好的排序类,会将上面的集合 按照定义好的规则来重新排列 
            alist.Sort(new SortByNum());

            //遍历排序好的alist单列集合
            foreach (var item in alist)
            {
                Console.WriteLine(item);
            }
        }

        private static void Add()
        {
            
            Console.WriteLine("请输入学生学号：");
            string Number = Console.ReadLine();
            if (ht.ContainsKey(Number))
            {
                Console.WriteLine("该学号已存在，不可重复添加");
                return;
            }
            Console.WriteLine("请输入学生姓名：");
            string Name = Console.ReadLine();
            Console.WriteLine("请输入学生年龄：");
            string Age = Console.ReadLine();

            Student stu = new Student(Number, Name, Age);
            //将用户输入的学号,封装的学生对象添加到集合中 
            ht.Add(Number, stu);
            Console.WriteLine("添加成功！！！");
            
        }
    }
}
